package com.bw.controller;

import com.alibaba.fastjson.JSONObject;
import com.bw.entity.User;
import com.bw.mapper.UserMapper;
import org.spring.kun.common.GiteeUtils;
import org.spring.kun.common.TokenUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import javax.servlet.http.HttpServletResponse;

/**
 * 第三方登录  不需要普通登录 点击 a标签进行登录
 */
@Controller
public class GiteeLoginController {


    @Autowired
    UserMapper userMapper;


    /**
     * 这个方法 ：点完同意授权之后 自动触发
     * @param code
     * @return
     */
    @RequestMapping("callbackCode.do")
    public String callbackCode(String code, HttpServletResponse response){

        System.out.println("接收到的临时授权码 " + code);

        // 根据授权码 获取token

        String tokenByCode = GiteeUtils.getAccessTokenByCode(code);
        System.out.println("获取到的token " + tokenByCode);
        // 根据token获取gitee的用户资源  把这个用户存到自己数据库  注册
        JSONObject userInfoByToken = GiteeUtils.getGiteeUserInfoByToken(tokenByCode);
        System.out.println("获取gitee的用户资源 " + userInfoByToken.toJSONString());

        //选取其中4个字段进行注册

        String name = userInfoByToken.getString("login"); // 把个人空间地址当做自己用户名
        String nickName = userInfoByToken.getString("name"); // 把用户名当做自己昵称
        String avtarUrl = userInfoByToken.getString("avatar_url"); // 把用户名当做自己昵称
        Integer giteeId = userInfoByToken.getInteger("id"); // 把 gitee主键ID 存到自己数据库

        // 开始执行注册  注册之前 判断一下是否已经注册过

        User userDB = userMapper.selectByName(name);
        if (userDB == null){  // 执行注册
            userDB = new User();
            userDB.setName(name);
            userDB.setNickName(nickName);
            userDB.setAvatarUrl(avtarUrl);
            userDB.setGiteeId(giteeId);
            userMapper.addUser(userDB);
        }else {  // 已经注册过了 ，刷新一下昵称和头像
            userDB.setAvatarUrl(avtarUrl);
            userDB.setNickName(nickName);
            userMapper.updateUser(userDB);

        }

        // 加密用户得到token  把token放入cookie返回给浏览器
        TokenUtils.responseTokenByCookie(userDB, response, 30);  // 登录成功的标志  给浏览器返回令牌
        //登录成功去列表

        return "redirect:list.do";

    }
}
